package com.tisumoon.utils;

import net.tsz.afinal.FinalBitmap;
import android.content.Context;

import com.wei.c.exception.FileCreateFailureException;
import com.wei.c.exception.SdCardNotMountedException;
import com.wei.c.exception.SdCardNotValidException;
import com.wei.c.file.FStoreLoc;
import com.wei.c.file.FStoreLoc.DirLevel;

public class ImageFactory {
	private static FinalBitmap mFbMemCache, mFbDiskCache;

	public static FinalBitmap getFbMemCache(Context context) {
		return getFbMemCache(context, -1, -1);
	}

	/**
	 * 取得一个全局默认的无磁盘缓存的图片加载器。该加载器不使用默认的R.drawable.empty_photo，因为afinal框架会将.9.png当做普通的bitmap来应用，
	 * 造成本全局组件影响范围较大，默认效果可以通过其他方式来满足。
	 * @param context
	 * @param maxWidth 大于该宽度的图片，将缩小到该范围以内（设置该参数时注意不同的屏幕宽度和图片的宽度的问题，慎用当前屏幕的宽度为宜）
	 * @param maxHeight 大于该高度的图片，将缩小到该范围以内
	 * @return
	 */
	public static FinalBitmap getFbMemCache(Context context, int maxWidth, int maxHeight) {
		if (mFbMemCache == null) {
			mFbMemCache = newFbMemCache(context, maxWidth, maxHeight, 0, 0);
		}
		return mFbMemCache;
	}

	/**
	 * 创建一个临时配置的无磁盘缓存的图片加载器。
	 * @param context
	 * @param maxWidth 大于该宽度的图片，将缩小到该范围以内（设置该参数时注意不同的屏幕宽度和图片的宽度的问题，慎用当前屏幕的宽度为宜）
	 * @param maxHeight 大于该高度的图片，将缩小到该范围以内
	 * @param loadingImageDrawableId
	 * @param loadfailImageDrawableId
	 * @return
	 */
	public static FinalBitmap newFbMemCache(Context context, int maxWidth, int maxHeight, int loadingImageDrawableId, int loadfailImageDrawableId) {
		FinalBitmap fb = FinalBitmap.create(context.getApplicationContext())
				.configMemoryCachePercent(40/100);
		if (loadingImageDrawableId > 0) fb.configLoadingImage(loadingImageDrawableId);
		if (loadfailImageDrawableId > 0) fb.configLoadfailImage(loadfailImageDrawableId);
		if (maxWidth > 0) fb.configBitmapMaxWidth(maxWidth);
		if (maxHeight > 0) fb.configBitmapMaxHeight(maxHeight);
		return fb;
	}

	public static FinalBitmap getFbDiskCache(Context context) {
		return getFbDiskCache(context, -1, -1);
	}

	/**
	 * 取得一个全局默认的有磁盘缓存的图片加载器。该加载器不使用默认的R.drawable.empty_photo，因为afinal框架会将.9.png当做普通的bitmap来应用，
	 * 造成本全局组件影响范围较大，默认效果可以通过其他方式来满足。
	 * @param context
	 * @param maxWidth 大于该宽度的图片，将缩小到该范围以内（设置该参数时注意不同的屏幕宽度和图片的宽度的问题，慎用当前屏幕的宽度为宜）
	 * @param maxHeight 大于该高度的图片，将缩小到该范围以内
	 * @return
	 */
	public static FinalBitmap getFbDiskCache(Context context, int maxWidth, int maxHeight) {
		if (mFbDiskCache == null) {
			mFbDiskCache = newFbDiskCache(context, maxWidth, maxHeight, 0, 0);
		}
		return mFbDiskCache;
	}

	/**
	 * 创建一个临时配置的有磁盘缓存的图片加载器。
	 * @param context
	 * @param maxWidth 大于该宽度的图片，将缩小到该范围以内（设置该参数时注意不同的屏幕宽度和图片的宽度的问题，慎用当前屏幕的宽度为宜）
	 * @param maxHeight 大于该高度的图片，将缩小到该范围以内
	 * @param loadingImageDrawableId
	 * @param loadfailImageDrawableId
	 * @return
	 */
	public static FinalBitmap newFbDiskCache(Context context, int maxWidth, int maxHeight, int loadingImageDrawableId, int loadfailImageDrawableId) {
		try {
			return newFbMemCache(context, maxWidth, maxHeight, loadingImageDrawableId, loadfailImageDrawableId)
					.configDiskCachePath(FStoreLoc.SURVIVE.getImagesCacheDir(context, DirLevel.PRIVATE).getPath());
		} catch (SdCardNotMountedException e) {
			e.printStackTrace();
		} catch (SdCardNotValidException e) {
			e.printStackTrace();
		} catch (FileCreateFailureException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void clearFbDiskCache(Context context) {
		getFbDiskCache(context).clearDiskCache();
	}
}
